//链表两两交换节点
public class swap_nodes_in_pairs {
    public static void main(String[] args) {
        ListNode list=new ListNode(1);
        ListNode cur=list;
        for(int i=2;i<5;i++){
            ListNode node=new ListNode(i);
            cur.next=node;
            cur=node;
        }
        func(list);
    }
    public static ListNode func(ListNode head){
        ListNode newHead=new ListNode();//哨兵位
        newHead.next=head;
        //直接用临时变量指定一次循环涉及到的四个节点
        ListNode prev=newHead;
        ListNode cur=head;
        if(cur==null) return head;
        ListNode next=cur.next;
        if(next==null) return head;
        ListNode nnext=next.next;
        while(cur!=null&&cur.next!=null){
            //根据交换后的顺序一次赋值
            // 头结点-> 1  ->2    ->3
            //  prev->cur->next->nnext
            //交换后  头结点 2 1 3
            //顺序就是 prev next cur nnext
            prev.next=next;
            next.next=cur;
            cur.next=nnext;

            //根据临时变量交换后的顺序
            //为下一次循环的临时变量赋值，期间注意空值和结束
            prev=cur;
            cur=nnext;
            if(cur==null) break;
            next=cur.next;
            if(next==null) break;
            nnext=next.next;
        }
        return newHead.next;
    }
}
